package liangtWorkSpace.springTest.annotationS;

import liangtWorkSpace.springTest.annotationS.action.PersonAction;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author liangt
 * @ClassName: AnnontationTest
 * @title: AnnontationTest
 * @projectName liangtWorkSpace.springTest.annotationS
 * @description:
 * Java 从 JDK 5.0 以后，提供了 Annotation（注解）功能，Spring 也提供了对 Annotation 技术的全面支持。Spring3 中定义了一系列的 Annotation（注解），常用的注解如下。
 * 1）@Component
 * 可以使用此注解描述 Spring 中的 Bean，但它是一个泛化的概念，仅仅表示一个组件（Bean），并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。
 * 2）@Repository
 * 用于将数据访问层（DAO层）的类标识为 Spring 中的 Bean，其功能与 @Component 相同。
 * 3）@Service
 * 通常作用在业务层（Service 层），用于将业务层的类标识为 Spring 中的 Bean，其功能与 @Component 相同。
 * 4）@Controller
 * 通常作用在控制层（如 Struts2 的 Action），用于将控制层的类标识为 Spring 中的 Bean，其功能与 @Component 相同。
 * 5）@Autowired
 * 用于对 Bean 的属性变量、属性的 Set 方法及构造函数进行标注，配合对应的注解处理器完成 Bean 的自动配置工作。默认按照 Bean 的类型进行装配。
 * 6）@Resource
 * 其作用与 Autowired 一样。其区别在于 @Autowired 默认按照 Bean 类型装配，而 @Resource 默认按照 Bean 实例名称进行装配。
 *
 * @Resource 中有两个重要属性：name 和 type。
 *
 * Spring 将 name 属性解析为 Bean 实例名称，type 属性解析为 Bean 实例类型。如果指定 name 属性，则按实例名称进行装配；如果指定 type 属性，则按 Bean 类型进行装配。
 *
 * 如果都不指定，则先按 Bean 实例名称装配，如果不能匹配，则再按照 Bean 类型进行装配；如果都无法匹配，则抛出 NoSuchBeanDefinitionException 异常
 * @date 2020/10/13 17:42
 */
public class AnnontationTest {
    @Test
    public void test() {
        //加载配置文件
        String xmlPath = "applicationContext.xml";
        // 初始化BeanFactory
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);

        //获取PersonAction实例
        PersonAction personAction = (PersonAction) applicationContext.getBean("personAction");
        //调用方法
        personAction.add();
        ;
    }
}
